import schedule
import time
import logging
import os
import csv
import re
from bs4 import BeautifulSoup
from request_utils import ask_url
from save_to_csv_utils import save_csv

# 配置日志
logging.basicConfig(filename='../spider.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 爬取的地址以及保存的文件名
BASE_URL = "https://movie.douban.com/chart"
CSV_PATH = "../豆瓣新片榜.csv"

# 正则表达式
# 跟continue_spider_movie_top.py中的正则表达式类似
FIND_LIST = re.compile(r'<a href="(.*?)">')  # 创建正则表达式对象，表示规则（字符串的模式）
FIND_IMG = re.compile(r'<img[^>]*src="([^"]+)"[^>]*>', re.S)  # re.S让换行包含在字符中
FIND_TITLE = re.compile(r'<img[^>]*alt="([^"]+)"[^>]*>')
FIND_TITLE2 = re.compile(r'<span style="font-size:13px;">(.*?)</span>')
FIND_TBG = re.compile(r'<p>(.*?)</p>', re.S)
FIND_Rating = re.compile(r'<span class="rating_nums">(.*?)</span>')
FIND_JUDGE = re.compile(r'\((\d+)人评价\)')

def run_spider():
    """运行爬虫程序"""
    logging.info("开始执行新电影爬虫程序...")
    print("开始执行新电影爬虫程序...")
    # 爬取数据
    movie_data = get_movie_data(BASE_URL)
    # 保存数据
    save_to_csv(movie_data, CSV_PATH)
    logging.info("新电影爬虫程序已执行，数据已保存在豆瓣新片榜")
    print("新电影爬虫程序已执行，数据已保存")

def get_movie_data(baseurl):
    """爬取网页数据"""
    datalist = []
    html = ask_url(baseurl)

    # 逐一解析数据
    soup = BeautifulSoup(html, 'html.parser')  # 后面是解析器
    for item in soup.find_all('tr', class_="item"):  # 查找符合要求的字符串，形成列表
        data = []  # 一部电影的所有信息
        item = str(item)

        # 获取影片详情的链接
        link = re.findall(FIND_LIST, item)[0]
        data.append(link)

        # 获取影片图片链接
        img_src = re.findall(FIND_IMG, item)[0]
        data.append(img_src)

        # 获取影片中文片名
        c_title = re.findall(FIND_TITLE, item)[0]
        data.append(c_title)

        # 获取影片其他片名
        o_title = re.findall(FIND_TITLE2, item)[0]
        data.append(o_title)

        # 电影背景信息
        bd = re.findall(FIND_TBG, item)[0]
        data.append(bd)

        # 获取影片评分
        rating = re.findall(FIND_Rating, item)
        if len(rating) > 0:
            rating = rating[0]
            data.append(rating)
        else:
            data.append(" ")

        # 获取评价人数
        judge_num = re.findall(FIND_JUDGE, item)
        if len(judge_num) > 0:
            judge_num = judge_num[0]
            data.append(judge_num)
        else:
            data.append(" ")

        datalist.append(data)  # 把处理好的信息放入datalist中

    return datalist

def save_to_csv(datalist, csv_path):
    """使用csv模块保存数据"""
    headers = ('电影详情链接', '电影图片链接', '影片中文名', '影片外国名', '相关内容', '评分', '评价数量')

    save_csv(datalist, csv_path, headers)

# 每天凌晨2点10分执行爬虫程序
schedule.every().day.at("02:10").do(run_spider)

if __name__ == '__main__':
    run_spider()  # 手动触发一次
    while True:
        schedule.run_pending()
        time.sleep(1)